From 77a3708213606d520833944141c3aa9169954e07 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Mon, 2 Mar 2026 00:55:08 +0100 Subject: web: refactor changelog to support a dedicated page for each version + links for each release --- apps/web/src/app/changelog/[version]/page.tsx | 98 +++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 apps/web/src/app/changelog/[version]/page.tsx (limited to 'apps/web/src/app/changelog/[version]') diff --git a/apps/web/src/app/changelog/[version]/page.tsx b/apps/web/src/app/changelog/[version]/page.tsx new file mode 100644 index 00000000..5b24af1e --- /dev/null +++ b/apps/web/src/app/changelog/[version]/page.tsx @@ -0,0 +1,98 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { notFound } from "next/navigation"; +import { BasePage } from "@/app/base-page"; +import { allChangelogs } from "content-collections"; +import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react"; +import { getSortedReleases } from "../utils"; +import { + ReleaseArticle, + ReleaseMeta, + ReleaseTitle, + ReleaseDescription, + ReleaseChanges, +} from "../components/release"; + +type Props = { params: Promise<{ version: string }> }; + +export async function generateStaticParams() { + return allChangelogs.map((r) => ({ version: r.version })); +} + +export async function generateMetadata({ params }: Props): Promise { + const { version } = await params; + const release = allChangelogs.find((r) => r.version === version); + if (!release) return {}; + return { + title: `${release.title} (${release.version}) - OpenCut Changelog`, + description: release.description, + }; +} + +export default async function ReleaseDetailPage({ params }: Props) { + const { version } = await params; + const releases = getSortedReleases(); + const index = releases.findIndex((r) => r.version === version); + + if (index === -1) notFound(); + + const release = releases[index]; + const newer = index > 0 ? releases[index - 1] : null; + const older = index < releases.length - 1 ? releases[index + 1] : null; + + return ( + +
+ + + All releases + + + +
+ + {release.title} + {release.description && ( + {release.description} + )} +
+ +
+ + +
+
+ ); +} -- cgit v1.3.1